/**
 * MCP 时间工具函数定义
 * 这个模块定义了所有通过MCP协议暴露的时间相关工具
 * 每个工具函数都遵循MCP协议的工具定义格式
 */

import {
  getCurrentTime,
  formatTime,
  getTimestamp,
  getTimezoneInfo,
  getTimeDifference
} from '../utils/timeUtils.js';

/**
 * 获取当前时间的工具定义
 * 这是最基础的工具，返回当前系统时间
 */
export const getCurrentTimeTool = {
  // 工具名称，用于MCP客户端调用
  name: "get_current_time",
  
  // 工具描述，告诉AI这个工具的功能
  description: "获取当前系统时间",
  
  // 输入参数定义（这个工具不需要参数）
  inputSchema: {
    type: "object",
    properties: {},
    required: []
  },
  
  // 工具执行函数
  handler: async () => {
    try {
      const currentTime = getCurrentTime();
      return {
        content: [
          {
            type: "text",
            text: `当前时间：${formatTime(currentTime, 'full')}`
          }
        ]
      };
    } catch (error) {
      throw new Error(`获取当前时间失败: ${error.message}`);
    }
  }
};

/**
 * 格式化时间的工具定义
 * 允许用户指定时间格式
 */
export const formatTimeTool = {
  name: "format_time",
  description: "格式化时间显示，支持多种格式选项",
  inputSchema: {
    type: "object",
    properties: {
      format: {
        type: "string",
        enum: ["full", "date", "time", "iso"],
        description: "时间格式：full(完整格式), date(日期), time(时间), iso(ISO格式)"
      },
      timestamp: {
        type: "number",
        description: "可选的时间戳，如果不提供则使用当前时间"
      }
    },
    required: []
  },
  handler: async (args) => {
    try {
      const { format = 'full', timestamp } = args;
      
      let date;
      if (timestamp) {
        date = new Date(timestamp);
      } else {
        date = getCurrentTime();
      }
      
      const formattedTime = formatTime(date, format);
      
      return {
        content: [
          {
            type: "text",
            text: `格式化时间 (${format}): ${formattedTime}`
          }
        ]
      };
    } catch (error) {
      throw new Error(`格式化时间失败: ${error.message}`);
    }
  }
};

/**
 * 获取时间戳的工具定义
 */
export const getTimestampTool = {
  name: "get_timestamp",
  description: "获取当前时间的Unix时间戳（毫秒）",
  inputSchema: {
    type: "object",
    properties: {},
    required: []
  },
  handler: async () => {
    try {
      const timestamp = getTimestamp();
      return {
        content: [
          {
            type: "text",
            text: `当前时间戳: ${timestamp} (毫秒)`
          }
        ]
      };
    } catch (error) {
      throw new Error(`获取时间戳失败: ${error.message}`);
    }
  }
};

/**
 * 获取时区信息的工具定义
 */
export const getTimezoneTool = {
  name: "get_timezone_info",
  description: "获取当前系统的时区信息",
  inputSchema: {
    type: "object",
    properties: {},
    required: []
  },
  handler: async () => {
    try {
      const timezoneInfo = getTimezoneInfo();
      return {
        content: [
          {
            type: "text",
            text: `时区信息:\n- 时区: ${timezoneInfo.timezone}\n- 偏移量: ${timezoneInfo.offset}分钟\n- 偏移小时: ${timezoneInfo.offsetHours}小时`
          }
        ]
      };
    } catch (error) {
      throw new Error(`获取时区信息失败: ${error.message}`);
    }
  }
};

/**
 * 计算时间差的工具定义
 */
export const calculateTimeDifferenceTool = {
  name: "calculate_time_difference",
  description: "计算两个时间之间的差值",
  inputSchema: {
    type: "object",
    properties: {
      startTime: {
        type: "number",
        description: "开始时间的时间戳（毫秒）"
      },
      endTime: {
        type: "number",
        description: "结束时间的时间戳（毫秒），如果不提供则使用当前时间"
      }
    },
    required: ["startTime"]
  },
  handler: async (args) => {
    try {
      const { startTime, endTime } = args;
      
      const startDate = new Date(startTime);
      const endDate = endTime ? new Date(endTime) : getCurrentTime();
      
      const difference = getTimeDifference(startDate, endDate);
      
      return {
        content: [
          {
            type: "text",
            text: `时间差: ${difference.formatted}\n详细: ${difference.days}天 ${difference.hours}小时 ${difference.minutes}分钟 ${difference.seconds}秒`
          }
        ]
      };
    } catch (error) {
      throw new Error(`计算时间差失败: ${error.message}`);
    }
  }
};

/**
 * 导出所有工具定义
 * 这个数组包含了所有可用的MCP工具
 */
export const timeTools = [
  getCurrentTimeTool,
  formatTimeTool,
  getTimestampTool,
  getTimezoneTool,
  calculateTimeDifferenceTool
]; 